#!/usr/bin/env node

/**
 * 图片视频下载器 - 构建脚本
 * 用于开发和生产环境的构建工具
 */

const fs = require('fs');
const path = require('path');

// 构建配置
const config = {
    sourceDir: './',
    outputDir: './dist',
    files: [
        'manifest.json',
        'background/background.js',
        'content/content.js',
        'popup/popup.html',
        'popup/popup.css',
        'popup/popup.js',
        'options/options.html',
        'options/options.css',
        'options/options.js',
        'utils/download-manager.js',
        'utils/storage-manager.js',
        'utils/context-menu-manager.js',
        'icons/icon16.png',
        'icons/icon32.png',
        'icons/icon48.png',
        'icons/icon128.png',
        'README.md'
    ],
    directories: [
        'background',
        'content',
        'popup',
        'options',
        'utils',
        'icons'
    ]
};

/**
 * 创建目录
 */
function createDirectory(dirPath) {
    if (!fs.existsSync(dirPath)) {
        fs.mkdirSync(dirPath, { recursive: true });
        console.log(`✅ 创建目录: ${dirPath}`);
    }
}

/**
 * 复制文件
 */
function copyFile(source, destination) {
    try {
        const destDir = path.dirname(destination);
        createDirectory(destDir);

        fs.copyFileSync(source, destination);
        console.log(`✅ 复制文件: ${source} -> ${destination}`);
    } catch (error) {
        console.error(`❌ 复制文件失败: ${source}`, error.message);
    }
}

/**
 * 复制目录
 */
function copyDirectory(source, destination) {
    if (!fs.existsSync(source)) {
        console.warn(`⚠️  源目录不存在: ${source}`);
        return;
    }

    createDirectory(destination);

    const items = fs.readdirSync(source);

    items.forEach(item => {
        const sourcePath = path.join(source, item);
        const destPath = path.join(destination, item);

        const stat = fs.statSync(sourcePath);

        if (stat.isDirectory()) {
            copyDirectory(sourcePath, destPath);
        } else {
            copyFile(sourcePath, destPath);
        }
    });
}

/**
 * 清理输出目录
 */
function cleanOutput() {
    if (fs.existsSync(config.outputDir)) {
        fs.rmSync(config.outputDir, { recursive: true, force: true });
        console.log(`🧹 清理输出目录: ${config.outputDir}`);
    }
}

/**
 * 构建扩展
 */
function build() {
    console.log('🚀 开始构建Chrome扩展...');

    // 清理输出目录
    cleanOutput();

    // 创建输出目录
    createDirectory(config.outputDir);

    // 复制文件
    config.files.forEach(file => {
        const sourcePath = path.join(config.sourceDir, file);
        const destPath = path.join(config.outputDir, file);

        if (fs.existsSync(sourcePath)) {
            copyFile(sourcePath, destPath);
        } else {
            console.warn(`⚠️  文件不存在: ${sourcePath}`);
        }
    });

    // 复制目录
    config.directories.forEach(dir => {
        const sourcePath = path.join(config.sourceDir, dir);
        const destPath = path.join(config.outputDir, dir);
        copyDirectory(sourcePath, destPath);
    });

    console.log('🎉 构建完成！');
    console.log(`📁 输出目录: ${path.resolve(config.outputDir)}`);
}

/**
 * 开发模式
 */
function dev() {
    console.log('🔧 开发模式启动...');
    console.log('📝 修改代码后，请在Chrome扩展管理页面点击"重新加载"');
    console.log('🌐 扩展管理页面: chrome://extensions/');
}

/**
 * 验证构建
 */
function validate() {
    console.log('🔍 验证构建...');

    const requiredFiles = [
        'manifest.json',
        'background/background.js',
        'content/content.js',
        'popup/popup.html',
        'popup/popup.css',
        'popup/popup.js'
    ];

    let isValid = true;

    requiredFiles.forEach(file => {
        const filePath = path.join(config.outputDir, file);
        if (fs.existsSync(filePath)) {
            console.log(`✅ ${file}`);
        } else {
            console.log(`❌ ${file} - 文件缺失`);
            isValid = false;
        }
    });

    if (isValid) {
        console.log('🎉 验证通过！');
    } else {
        console.log('❌ 验证失败！');
        process.exit(1);
    }
}

/**
 * 创建ZIP包
 */
function createZip() {
    console.log('📦 创建ZIP包...');

    // 这里可以集成zip库来创建ZIP文件
    // 暂时只是提示
    console.log('💡 ZIP功能需要安装额外的依赖');
    console.log('💡 可以使用以下命令手动创建ZIP:');
    console.log(`   cd ${config.outputDir}`);
    console.log('   zip -r ../extension.zip .');
}

/**
 * 显示帮助信息
 */
function showHelp() {
    console.log(`
📦 图片视频下载器 - 构建工具

用法: node build.js [命令]

命令:
  build    构建生产版本
  dev      开发模式
  validate 验证构建
  zip      创建ZIP包
  help     显示帮助信息

示例:
  node build.js build
  node build.js dev
  node build.js validate
  node build.js zip
`);
}

/**
 * 主函数
 */
function main() {
    const command = process.argv[2] || 'help';

    switch (command) {
        case 'build':
            build();
            break;
        case 'dev':
            dev();
            break;
        case 'validate':
            validate();
            break;
        case 'zip':
            createZip();
            break;
        case 'help':
        default:
            showHelp();
            break;
    }
}

// 运行主函数
if (require.main === module) {
    main();
}

module.exports = {
    build,
    dev,
    validate,
    createZip,
    config
}; 